package com.system.connect.springboot_flowers.controller;

import cn.hutool.crypto.digest.MD5;
import com.system.connect.springboot_flowers.dto.UsersDto;
import com.system.connect.springboot_flowers.entity.Users;
import com.system.connect.springboot_flowers.service.IUsersService;
import com.system.connect.springboot_flowers.utils.R;
import com.system.connect.springboot_flowers.utils.TokenUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.UnsupportedEncodingException;
import java.util.List;

/**
 * <p>
 * 用户表 前端控制器
 * </p>
 *
 * @author yang
 * @since 2025-01-13
 */
@RestController
@RequestMapping("/api/users")
public class UsersController {

    @Autowired
    private IUsersService usersService;

    /**
     * 用户注册
     */
    @PostMapping("/register")
    public R register(@RequestBody UsersDto usersDto) {
        usersService.register(usersDto);
        return R.success("注册成功");
    }

    /**
     * 用户登录
     */
    @PostMapping("/login")
    public R login(@RequestBody UsersDto usersDto) throws UnsupportedEncodingException {
        String password = MD5.create().digestHex(usersDto.getPassword());
        Users user = usersService.lambdaQuery()
                .eq(Users::getUsername, usersDto.getUsername())
                .eq(Users::getPasswordHash, password)
                .one();
        //设置Token
        String token1 = TokenUtils.genToken1(user.getUserId(),user.getPasswordHash());
        usersDto.setToken(token1);

        if (user != null) {
            return R.success(usersDto);
        } else {
            return R.error("用户名或密码错误");
        }
    }

    /**
     * 用户信息
     */
    @GetMapping("/info")
    public R info() {
        String user = TokenUtils.getUser();
        if (user != null) {
            return R.success(usersService.lambdaQuery()
                    .eq(Users::getUserId, user)
                    .one());
        } else {
            return R.error("用户信息获取失败");
        }
    }

    @GetMapping("/{user_id}") // 确保路径与前端请求匹配
    public R getPostDetail(@PathVariable("user_id") Integer userId) {
        Users user = usersService.getById(userId);
        return R.success(user);
    }

    /**
     * 获取所有用户列表（管理员接口）
     */
    @GetMapping("/admin/list")
    public R getAllUsers() {
        List<Users> users = usersService.list();
        return R.success(users);
    }

    /**
     * 创建新用户（管理员接口）
     */
    @PostMapping("/admin/create")
    public R createUser(@RequestBody Users user) {
        // 密码加密
        if (user.getPasswordHash() != null) {
            user.setPasswordHash(MD5.create().digestHex(user.getPasswordHash()));
        }
        boolean result = usersService.save(user);
        return result ? R.success("创建用户成功") : R.error("创建用户失败");
    }

    /**
     * 更新用户信息（管理员接口）
     */
    @PutMapping("/admin/update/{id}")
    public R updateUser(@PathVariable("id") Integer id, @RequestBody Users user) {
        user.setUserId(id);
        // 如果更新了密码，需要重新加密
        if (user.getPasswordHash() != null) {
            user.setPasswordHash(MD5.create().digestHex(user.getPasswordHash()));
        }
        boolean result = usersService.updateById(user);
        return result ? R.success("更新用户成功") : R.error("更新用户失败");
    }

    /**
     * 删除用户（管理员接口）
     */
    @DeleteMapping("/admin/delete/{id}")
    public R deleteUser(@PathVariable("id") Integer id) {
        boolean result = usersService.removeById(id);
        return result ? R.success("删除用户成功") : R.error("删除用户失败");
    }

    /**
     * 获取用户详情（管理员接口）
     */
    @GetMapping("/admin/detail/{id}")
    public R getUserDetail(@PathVariable("id") Integer id) {
        Users user = usersService.getById(id);
        return user != null ? R.success(user) : R.error("用户不存在");
    }

    @PostMapping("/logout")
    public R logout(HttpServletRequest request) {
        try {
            // 获取当前会话
            HttpSession session = request.getSession(false);
            if (session != null) {
                // 清除会话中的用户信息
                session.removeAttribute("user");
                // 使会话失效
                session.invalidate();
            }

            return R.success("退出登录成功");
        } catch (Exception e) {
            return R.error( "退出登录失败");
        }
    }
}
